﻿#ifndef _BASEMAP_H_INCLUDE_
#define _BASEMAP_H_INCLUDE_

#include "common.h"

#include <QRect>
#include <QList>
#include <QSize>
#include <QHash>

class BaseRole;

class BaseMapTile
{
public:
    BaseMapTile(int index=-1);
    ~BaseMapTile();

    /// 设置地图区域的索引
    inline void setIndex(int index) { mIndex = index; }
    /// 得到地图区域的索引
    inline int getIndex(void) { return mIndex; }
    /// 设置地图区域的范围
    inline void setRect(QRect rect) { mRect = rect; }
    /// 得到地图区域的范围
    inline QRect getRect(void) { return mRect; }

    /// 添加一个角色到可视角色列表中
    bool addRole(BaseRole *role);
    /// 从可视角色列表中删除指定角色
    bool delRole(BaseRole *role);
    /// 清空可视角色列表
    void clearRoleList(void);
    /// 检测指定角色是否存在列表中
    bool isExistRole(BaseRole *role);
    /// 得到指定范围内的所有角色
    QList<BaseRole*> getRoleByRect(QRect rect);
    /// 得到地图区域中相应所有角色
    QList<BaseRole*> getTypeRoles(RoleType type);

private:
    int mIndex;                   /**< 索引 */
    QRect mRect;                  /**< 范围 */
    QList<BaseRole*> mRoleList;   /**< 区域内的角色列表 */
};

class BaseMap
{
public:
    BaseMap(int mapindex=-1);
    ~BaseMap();

    /// 设置角色所在地图索引
    inline void setMapIndex(int index) { mMapIndex = index; }
    /// 得到角色所在地图索引
    inline int getMapIndex(void) { return mMapIndex; }
    /// 设置地图名称
    inline void setName(QString name) { mName = name; }
    /// 得到地图名称
    inline QString getName(void) { return mName; }
    /// 设置玩家在地图上的起始位置
    inline void setPlayerStartPos(QPoint pos) { mPlayerStartPos = pos; }
    /// 得到玩家在地图上的起始位置
    inline QPoint getPlayerStartPos(void) { return mPlayerStartPos; }
    /// 设置地图区域的范围
    inline void setRect(QRect rect) { mRect = rect; }
    /// 得到地图区域的范围
    inline QRect getRect(void) { return mRect; }
    /// 设置地图上最大怪物数量
    inline void setMaxMonsterCount(int count) { mMonsterMaxCount = count; }
    /// 得到地图上最大怪物数量
    inline int getMaxMonsterCount(void) { return mMonsterMaxCount; }
    /// 添加一个地图入口
    inline void addMapEntrance(tagMapEntrance entrance) { mMapEntrance.push_back(entrance); }
    /// 根据一个坐标点得到相应地图入口信息
    tagMapEntrance* getMapEntrance(QPoint position);
    /// 得到所有的地图入口信息
    inline QVector<tagMapEntrance>& getMapEntrances(void) { return mMapEntrance; }
    /// 得到一个随机出生点
    QPoint generatearandombirthcoordinate(void);

    /// 设置地图块高宽
    void setTileSize(QSize size);
    /// 得到地图块高宽
    QSize getTileSize(void) { return mTileSize; }
    /// 删除所有的地图块
    void delMapTiles(void);

    /// 加入一个角色到地图中
    void addRoleToMap(BaseRole *role);
    /// 根据角色坐标更新相应地图块
    void updateRoleMapTile(BaseRole *role);
    /// 从地图中清除指定的角色
    void delRoleFromMap(BaseRole *role);
    /// 检测当前地图是否存在这个角色
    int isExistRole(BaseRole *role);
    /// 根据角色坐标找到相应地图块
    int getRoleMapTile(BaseRole *role);
    /// 得到地图区域中相应所有角色
    QList<BaseRole*> getTypeRoles(RoleType type);

private:
    /// 更新角色可视角色列表
    void updateRoleViewRoleList(BaseRole *role);

private:
    int mMapIndex;                         /**< 角色所在地图索引 */
    QString mName;                         /**< 名称 */
    QRect mRect;                           /**< 范围 */
    QSize mTileSize;                       /**< 地图块高宽 */
    QHash<int,BaseMapTile*> mMapTileList;  /**< 地图块列表 */
    int mMonsterMaxCount;                  /**< 地图上怪物最大数量 */
    QPoint mPlayerStartPos;                /**< 玩家在地图上的起始位置 */
    QVector<tagMapEntrance> mMapEntrance;  /**< 当前地图到其它地图的入口 */
};

#endif // BASEMAP_H
